package com.efast.cafe.portal.service.api.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import com.efast.cafe.framework.exception.ServiceException;
import com.efast.cafe.framework.util.SpringWebUtils;
import com.efast.cafe.portal.bean.api.PortalApiProjectBean;
import com.efast.cafe.portal.bean.api.PortalApiSystemBean;
import com.efast.cafe.portal.bean.api.PortalApiSytemQueryBean;
import com.efast.cafe.portal.dao.api.PortalApiProSysDefDao;
import com.efast.cafe.portal.dao.api.PortalApiProjectDao;
import com.efast.cafe.portal.dao.api.PortalApiSysModDefDao;
import com.efast.cafe.portal.dao.api.PortalApiSystemDao;
import com.efast.cafe.portal.service.api.IPortalApiSystemService;
import com.efast.cafe.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * <p>
 * Service接口实现类
 * </p>
 * <p>
 * Table: portal_api_system - 所属系统定义
 * </p>
 *
 * @since 2017-08-08 11:45:57
 */
@Service
@Transactional
public class PortalApiSystemServiceImpl implements IPortalApiSystemService {

	private PortalApiSystemDao portalApiSystemDao;

	private PortalApiProSysDefDao portalApiProSysDefDao;

	private PortalApiSysModDefDao portalApiSysModDefDao;

	private PortalApiProjectDao portalApiProjectDao;

	@Autowired
	public void setPortalApiSystemDao(PortalApiSystemDao portalApiSystemDao) {
		this.portalApiSystemDao = portalApiSystemDao;
	}

	@Autowired
	public void setPortalApiProSysDefDao(PortalApiProSysDefDao portalApiProSysDefDao) {
		this.portalApiProSysDefDao = portalApiProSysDefDao;
	}

	@Autowired
	public void setPortalApiSysModDefDao(PortalApiSysModDefDao portalApiSysModDefDao) {
		this.portalApiSysModDefDao = portalApiSysModDefDao;
	}

	@Autowired
	public void setPortalApiProjectDao(PortalApiProjectDao portalApiProjectDao) {
		this.portalApiProjectDao = portalApiProjectDao;
	}

	/**
	 * 新增apisystem {@inheritDoc} overridden:
	 * 
	 * @Date : 2017年8月10日
	 * @see com.efast.cafe.portal.remote.api.PortalApiSystemService#insertApiSystem(com.efast.cafe.portal.bean.api.PortalApiSystemBean)
	 *
	 */
	@Override
	public int insertApiSystem(PortalApiSystemBean portalApiSystemBean) {
		apiSystemBeanCheck(portalApiSystemBean);
		// 产生系统唯一标识
		portalApiSystemBean.setUuid(UUID.randomUUID().toString());
		portalApiSystemBean.setStatus((byte) 2);
		// 判断版本号是否重复
		if (apiSystemVersionIsExist(portalApiSystemBean)) {
			throw new ServiceException(portalApiSystemBean.getVersion() + "版本号重复！");
		}
		// 验证标识符是否重复 
		if (apiSystemIndentifierIsExist(portalApiSystemBean)) {
			throw new ServiceException("系统标识符已经存在！");
		}
		// 新增系统
		portalApiSystemDao.insertApiSystem(portalApiSystemBean);
		// 增加系统跟项目之间的关系,0是默认关系
		portalApiProSysDefDao.insertApiProSysDef(portalApiSystemBean.getProjectId(), portalApiSystemBean.getId(), 0,
				SpringWebUtils.getRequestUser());
		return portalApiSystemBean.getId();
	}

	/**
	 * 
	 * <p>
	 * Title: updateApiSystem
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param apiSystemBean
	 * @Date 2017年8月11日
	 * @see com.efast.cafe.portal.remote.api.PortalApiSystemService#updateApiSystem(com.efast.cafe.portal.bean.api.PortalApiSystemBean)
	 */
	@Override
	public void updateApiSystem(PortalApiSystemBean portalApiSystemBean) {
		apiSystemBeanCheck(portalApiSystemBean);
		if (apiSystemVersionIsExist(portalApiSystemBean)) {
			throw new ServiceException("版本已存在");
		}
		portalApiSystemDao.updateApiSystem(portalApiSystemBean);
	}

	/**
	 * 
	 * <p>
	 * Title: deleteApiSystem
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param id
	 * @Date 2017年8月11日
	 * @see com.efast.cafe.portal.remote.api.PortalApiSystemService#deleteApiSystem(java.lang.Integer)
	 */
	@Override
	public void deleteApiSystem(Integer id) {
		String user = SpringWebUtils.getRequestUser();
		// 判断系统下是否有有效模块，如果有不能删除系统
		if (portalApiSysModDefDao.moduleCountBySyetemId(id) != 0) {
			throw new ServiceException("系统下有模块，请先删除模块！");
		}
		// 删除项目系统关系
		portalApiProSysDefDao.deleteApiProSysDef(id, user);
		// 删除系统
		portalApiSystemDao.deleteApiSystemById(id);

	}

	/**
	 * 发布系统
	 * <p>
	 * Title: publishApiSystem
	 * </p>
	 * 
	 * @param portalApiServicePublishBean
	 * @Date 2017年8月15日
	 * @see com.efast.cafe.portal.remote.api.PortalApiSystemService#publishApiSystem(com.efast.cafe.portal.bean.api.PortalApiServicePublishBean)
	 */
	@Override
	public void publishApiSystem(PortalApiSystemBean portalApiSystemBean) {
		String user = SpringWebUtils.getRequestUser();
		portalApiSystemBean.setStatus((byte) 1);
		portalApiSystemBean.setCreateUser(user);
		// 版本是否重复
		if (apiSystemVersionIsExist(portalApiSystemBean)) {
			throw new ServiceException(portalApiSystemBean.getVersion() + "版本重复!");
		}
		List<Integer> moduleIds = portalApiSystemBean.getModuleIds();
		if (moduleIds.isEmpty()) {
			throw new ServiceException("请选择要发布的模块版!");
		}
		Integer projectId = portalApiSystemBean.getProjectId();

		// 清除项目与系统的原默认关系
		List<Integer> systemIds = new ArrayList<Integer>();
		systemIds.add(portalApiSystemBean.getId());
		// portalApiProSysDefDao.cleanApiProSysDefaultDef(projectId, systemIds,
		// user);
		// 发布一个新系统
		portalApiSystemDao.copyApiSystem(portalApiSystemBean);
		Integer systemId = portalApiSystemBean.getId();
		// Integer isDefault = portalApiServicePublishBean.getIsDefault();
		// 新增发布后的新系统与项目关系
		portalApiProSysDefDao.insertApiProSysDef(projectId, systemId, 1, user);

		// 产生发布的新系统与发布的模块的关系,默认显示的关系
		portalApiSysModDefDao.insertApiSysModDefList(systemId, moduleIds, user);
	}

	/**
	 * 系统升级
	 * <p>
	 * Title: upgradeApiSystem
	 * </p>
	 * 
	 * @param apiSystemUpgradeBean
	 * @Date 2017年8月15日
	 * @see com.efast.cafe.portal.remote.api.PortalApiSystemService#upgradeApiSystem(com.efast.cafe.portal.bean.api.PortalApiSystemUpgradeBean)
	 */
	@Override
	public void upgradeApiSystem(PortalApiSystemBean portalApiSystemBean) {
		String user = SpringWebUtils.getRequestUser();
		PortalApiProjectBean project = portalApiSystemBean.getProject();
		Integer projectId = project.getProjectId();
		Integer fromId = portalApiSystemBean.getId();
		// 版本是否重复
		portalApiSystemBean.setStatus((byte) 2);
		if (apiSystemVersionIsExist(portalApiSystemBean)) {
			throw new ServiceException(portalApiSystemBean.getVersion() + "版本重复!");
		}

		if (project != null) {
			if (project.getStatus() == 1) {
				// 先升级项目
				projectId = upgradeProject(project, user);
			}

		}
//		Integer isDefault = portalApiSystemBean.getIsDefault();
		// 清除原系统与项目默认关系关系
		List<Integer> systemIds = new ArrayList<Integer>();
		systemIds.add(fromId);
		// portalApiProSysDefDao.cleanApiProSysDefaultDef(projectId, systemIds,
		// user);
		// 升级系统
		portalApiSystemDao.copyApiSystem(portalApiSystemBean);
		// 新增系统与项目关系
		Integer systemId = portalApiSystemBean.getId();
		portalApiProSysDefDao.insertApiProSysDef(projectId, systemId, 1, user);
		// 复制系统模块关系
		portalApiSysModDefDao.copyApiSysModDefListTo(fromId, systemId, user);
	}

	/**
	 * 升级项目
	 * 
	 * @param project
	 * @param user
	 * @param systemId
	 * @return int
	 * @Author Administrator
	 * @Date 2017年8月15日
	 */
	private int upgradeProject(PortalApiProjectBean project, String user) {
		project.setParentId(project.getId());
		project.setStatus((byte) 2);
		project.setParentLastTime(project.getLastUpdateTime());
		// 升级项目，相当于复制项目
		portalApiProjectDao.insertApiProject(project);
		portalApiProSysDefDao.upgradeApiProSysDef(project.getId(), project.getParentId(), user);
		return project.getId();
	}

	/**
	 * 查询系统的所有版本
	 * <p>
	 * Title: queryApiSystemAllVersions
	 * </p>
	 * 
	 * @param projectId
	 * @param systemId
	 * @return
	 * @Date 2017年8月22日
	 * @see com.efast.cafe.portal.remote.api.PortalApiSystemService#queryApiSystemAllVersions(java.lang.Integer,
	 *      java.lang.Integer)
	 */
	@Override
	public List<PortalApiSystemBean> queryApiSystemOtherVersions(Integer projectId, Integer systemId, Integer status) {
		if(projectId == null||systemId == null){
			throw new ServiceException("参数传入错误！");
		}
		return portalApiSystemDao.queryApiSystemVersions(projectId, systemId, status);
	}

	@Override
	public boolean apiSystemVersionIsExist(PortalApiSystemBean portalApiSystemBean) {
		if (portalApiSystemDao.apiSystemVersionIsExist(portalApiSystemBean) > 0) {
			return true;
		}
		return false;
	}

	/**
	 * 系统信息校验
	 * 
	 * @param portalApiSystemBean
	 *            void
	 * @Author Administrator
	 * @Date 2017年8月24日
	 */
	private void apiSystemBeanCheck(PortalApiSystemBean portalApiSystemBean) {
		// 服务路径验证
		String systemName = portalApiSystemBean.getSystemName();
		String uri = portalApiSystemBean.getSystemPath();
		if (StringUtil.isEmpty(systemName) || StringUtil.isEmpty(uri)) {
			throw new ServiceException("系统名称或路径不能为空！");
		}
		if (!uri.startsWith("/")) {
			throw new ServiceException("系统路径格式不正确！");
		}
		uri=uri.trim();
		portalApiSystemBean.setSystemPath(uri);
	}

	/**
	 * 判断系统版本是否存在
	 * <p>
	 * Title: queryApiSystemList
	 * </p>
	 * 
	 * @param queryBean
	 * @return
	 * @Date 2017年9月1日
	 * @see com.efast.cafe.portal.remote.api.PortalApiSystemService#queryApiSystemList(com.efast.cafe.portal.bean.api.PortalApiSytemQueryBean)
	 */
	@Override
	public PortalApiSytemQueryBean queryApiSystemList(PortalApiSytemQueryBean queryBean) {
		String systemName=queryBean.getSystemName();
		if(!StringUtil.isEmpty(systemName)){
			queryBean.setSystemName(systemName.trim());
		}
		List<PortalApiSystemBean> systemList = portalApiSystemDao.queryPortalApiSystemsBy(queryBean.getProjectId(), 1,queryBean.getSystemName());
		queryBean.setResultList(systemList);
		queryBean.setTotalRows(systemList.size());
		return queryBean;
	}

	/**
	 * 判断系统标识符是否存在
	 * <p>
	 * Title: apiSystemIndentifierIsExist
	 * </p>
	 * 
	 * @param portalApiSystemBean
	 * @return
	 * @Date 2017年9月1日
	 * @see com.efast.cafe.portal.remote.api.PortalApiSystemService#apiSystemIndentifierIsExist(com.efast.cafe.portal.bean.api.PortalApiSystemBean)
	 */
	@Override
	public boolean apiSystemIndentifierIsExist(PortalApiSystemBean portalApiSystemBean) {
		String indentifier = portalApiSystemBean.getIndentifier();
		Integer projectId = portalApiSystemBean.getProjectId();
		Integer systemId = portalApiSystemBean.getSystemId();
		if (portalApiSystemDao.apiSystemIndentifierIsExist(indentifier, projectId, systemId) > 0) {
			return true;
		}
		return false;
	}

}